/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.gob.mh.dgii.service.ruc;

import java.util.Date;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import sv.gob.mh.dgii.common.Utils;
import sv.gob.mh.dgii.model.RcRuc;

/**
 *
 * @author hgonzalez
 */
@Service
@Transactional(readOnly=true, propagation=Propagation.REQUIRED)
public class RcRiesgoServiceImpl implements RcRiesgoService {
    
    
    
    public String getRiesgo (RcRuc risk, RcRuc dto) {
		String riesgo = RIESGO_INDETERMINADO;
		//1ape
		if(risk.getS1apeRasoc().equalsIgnoreCase(dto.getS1apeRasoc().trim())){
			//Natural
			if(dto.getTbTipoContrib().getId().getCclase().equals("N")){
				//1ape + nombres
				if(risk.getSnombres().equalsIgnoreCase(dto.getSnombres().trim())){
					//Nacional
					if(dto.getTbPais().getCpais().equals(_SV_CODE)){
						//1ape + nombres + dpto + mun
						if(risk.getTbMunicipio().getId().getCdepartamento().equals(dto.getTbMunicipio().getId().getCdepartamento())
							&& risk.getTbMunicipio().getId().getCmunicipio().equals(dto.getTbMunicipio().getId().getCmunicipio())){
							riesgo = RIESGO_MEDIO;
						}
						//1ape + nombres + fnac
						if(risk.getFnacConst().equals(dto.getFnacConst())){
							if(riesgo.equals(RIESGO_MEDIO)){
								//1ape + 2ape + nombres + fnac + dpto + mun
								if(!Utils.isNullOrEmpty(risk.getS2apeAbrev()) 
									&& !Utils.isNullOrEmpty(dto.getS2apeAbrev()) 
									&& risk.getS2apeAbrev().equalsIgnoreCase(dto.getS2apeAbrev().trim())){
									riesgo = RIESGO_ALTO;
								}
								else{
									//Si coinciden en no tener 2o apellido.
									if( Utils.isNullOrEmpty(risk.getS2apeAbrev())
											&& Utils.isNullOrEmpty(dto.getS2apeAbrev()) ){
										riesgo = RIESGO_ALTO;
									}
								}
							}
							//1ape + nombres + fnac
							else{
								riesgo = RIESGO_BAJO;
							}
						}
					}
					//Extranjera
					else{
						//1ape + nombres + pais
						if(risk.getTbPais().getCpais().equals(dto.getTbPais().getCpais())){
							riesgo = RIESGO_MEDIO;
						}
						//1ape + nombres + fnac
						if(risk.getFnacConst().equals(dto.getFnacConst())){
							if(riesgo.equals(RIESGO_MEDIO)){
								//1ape + 2ape + nombres + pais + fnac
								if(!Utils.isNullOrEmpty(risk.getS2apeAbrev())
									&& !Utils.isNullOrEmpty(dto.getS2apeAbrev())
									&& risk.getS2apeAbrev().equalsIgnoreCase(dto.getS2apeAbrev().trim())){
									riesgo = RIESGO_ALTO;
								}
								else{
									//Si coinciden en no tener 2o apellido.
									if( Utils.isNullOrEmpty(risk.getS2apeAbrev())
											&& Utils.isNullOrEmpty(dto.getS2apeAbrev()) ){
										riesgo = RIESGO_ALTO;
									}
								}
							}
							//1ape + nombres + fnac
							else{
								riesgo = RIESGO_BAJO;
							}
						}
					}
				}
			}
			//Juridica
			else{
				riesgo = RIESGO_BAJO;
				//Nacional
				if(dto.getTbPais().getCpais().equals(_SV_CODE)){
					//1ape + dpto + mun
					if(risk.getTbMunicipio().getId().getCdepartamento().equals(dto.getTbMunicipio().getId().getCdepartamento())
					  && risk.getTbMunicipio().getId().getCmunicipio().equals(dto.getTbMunicipio().getId().getCmunicipio())){
						//1ape + fnac + dto + mun
						if(risk.getFnacConst().equals(dto.getFnacConst())){
							riesgo = RIESGO_ALTO;
						}
						else{
							riesgo = RIESGO_MEDIO;
						}
					}
				}
				//Extranjera
				else{
					//1ape + pais
					if(risk.getTbPais().getCpais().equals(dto.getTbPais().getCpais())){
						//1ape + pais + fnac
						if(risk.getFnacConst().equals(dto.getFnacConst())){
							riesgo = RIESGO_ALTO;
						}
						else{
							riesgo = RIESGO_MEDIO;
						}
					}
				}
			}
		}
		return riesgo;
	}
    
    public Boolean esPrimerApellidoIgual(RcRuc contrib1, RcRuc contrib2) {
		String apeRasoc01 = contrib1.getS1apeRasoc();
		String apeRasoc02 = contrib2.getS1apeRasoc();
		return Utils.secureEqualsString(apeRasoc01, apeRasoc02);
    }
    
    public Boolean esNombreIgual(RcRuc contrib1, RcRuc contrib2) {
		String snombres01 = contrib1.getSnombres();
		String snombres02 = contrib2.getSnombres();
		return Utils.secureEqualsString(snombres01, snombres02);
    }

    public Boolean esSegundoApellidoIgual(RcRuc contrib1, RcRuc contrib2) {
		String apeAbrev01 = contrib1.getS2apeAbrev();
		String apeAbrev02 = contrib2.getS2apeAbrev();
		return Utils.secureEqualsString(apeAbrev01, apeAbrev02);
	}
    
    private Boolean esFechaNacConstIgual(RcRuc contrib, RcRuc listItem) {
	Date birth01 = contrib.getFnacConst();
	Date birth02 = listItem.getFnacConst();
	return birth01.equals(birth02);
    }
    
    public Boolean esMunicipioIgual(RcRuc contrib1, RcRuc contrib2) {
		String depto01 = "";
                String depto02 = "";
                String munic01 = "";
		String munic02 = "";
                
                if(!Utils.isNullOrEmpty(contrib1.getTbMunicipio())){
                    depto01 = contrib1.getTbMunicipio().getId().getCdepartamento();
                }
                if(!Utils.isNullOrEmpty(contrib2.getTbMunicipio())){
                    depto02 = contrib2.getTbMunicipio().getId().getCdepartamento();
                }
		
                if(!Utils.isNullOrEmpty(contrib1.getTbMunicipio())){
                    munic01 = contrib1.getTbMunicipio().getId().getCmunicipio();
                }
                if(!Utils.isNullOrEmpty(contrib2.getTbMunicipio())){
                    munic02 = contrib2.getTbMunicipio().getId().getCmunicipio();
                }
                
		return Utils.secureEqualsString(munic01, munic02)
				&& Utils.secureEqualsString(depto01, depto02);
	}
    
    
}
